﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Collections;
using System.Text.RegularExpressions;

namespace Universitario.DAO
{
    public class EmpresaDAO
    {
        private static DataClasses1DataContext dc = new DataClasses1DataContext();

        public static ArrayList erros
        {
            get;
            set;
        }

        /// <exception cref="ArgumentException">A exception é lançada quando algum campo do Usuário é inválido.</exception>
        public static void Insert(Empresa empresa)
        {
            String emailRegexStr = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
                @"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" + 
                @".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";
            String cnpjRegexStr = @"^\d{3}.?\d{3}.?\d{3}/?\d{3}-?\d{2}$";

            Regex cnpjRegex = new Regex(cnpjRegexStr);
            Regex emailRegex = new Regex(emailRegexStr);

            // Nome preenchido
            if (empresa.nome.Length < 3)
            {
                erros.Add(new KeyValuePair<String, String>("Nome", "Nome precisa ter no mínimo 3 letras."));
            }

            // Email "valido"
            if (!emailRegex.IsMatch(empresa.email))
            {
                erros.Add(new KeyValuePair<String, String>("Email", "E-mail inválido."));
            }

            // Area de atuação prenchida
            if (empresa.area.Length < 3)
            {
                erros.Add(new KeyValuePair<String, String>("Area", "Área de Atuação precisa ter no mínimo 3 letras."));
            }

            // CNPJ "valido"
            if (cnpjRegex.IsMatch(empresa.cnpj))
            {
                erros.Add(new KeyValuePair<String, String>("CNPJ", "CNPJ Inválido."));
            }

            if (SelectByCNPJ(empresa.cnpj) != null)
            {
                erros.Add(new KeyValuePair<String, String>("CNPJ", "Empresa ja cadastrada com esse CNPJ."));
            }

            dc.Empresas.InsertOnSubmit(empresa);
            dc.SubmitChanges();
        }

        public static Empresa SelectById(long id)
        {
            var query = from empresa in dc.Empresas
                        where empresa.id == id
                        select empresa;

            return query.FirstOrDefault();
        }

        public static Empresa SelectByNome(String nome)
        {
            var query = from empresa in dc.Empresas
                        where empresa.nome == nome
                        select empresa;

            return query.FirstOrDefault();
        }

        public static bool temRepresentante(long id)
        {
            var query = from representacao in dc.Representacaos
                        where representacao.empresa_id == id
                        select 1;
            return query.Count() != 0;
        }

        public static Empresa SelectByCNPJ(String cnpj)
        {
            var query = from empresa in dc.Empresas
                        where empresa.cnpj == cnpj
                        select empresa;

            return query.FirstOrDefault();
        }
    }
}